using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using MakeIT.Deo.Negocios;
using System.Data.Entity;
using System.IO;
using System.Net.Mail;
using System.Configuration;
using System.Net;
using System.Text;
using System.Net.Mime;

namespace MakeIT.Deo.Apresentacao
{
    public partial class CadastroOrcamento : System.Web.UI.Page
    {
        usuario usuarioVO = null;

        protected void Page_Load(object sender, EventArgs e)
        {
                usuarioVO = (usuario)this.Session["userActive"];

            if (!IsPostBack)
            {
                Util.HabilitarCampos(false, this.panelCad);
            }
        }

        /// <summary>
        /// Manipula o evento do bot&atilde;o btnSalvar
        /// </summary>
        /// <param name="sender">Objeto disparador do evento</param>
        /// <param name="e">Argumento do evento</param>
        protected void btnSalvar_Click(object sender, EventArgs e)
        {

            //Declara objetos
            orcamento orcamentoVO = null;
            OrcamentoBO orcamentoBO = null;
            OrcamentoItemBO orcamentoItemBO = null;
            //bool novoRegistro = false;

            try
            {

                //Cria objeto
                orcamentoBO = new OrcamentoBO();
                orcamentoItemBO = new OrcamentoItemBO();

                ////Verifica se o ID é nulo, se sim = cadastro novo
                //if (string.IsNullOrEmpty(this.txtCadId.Text))
                //{
                    
                //    orcamentoVO = new orcamento();
                //    novoRegistro = true;
                //}
                ////Recupera dados para serem alterados
                //else
                //{
                    //Recupera dados
                orcamentoVO = orcamentoBO.RecuperaOrcamento(Int32.Parse(this.txtCadId.Text));

                //}

                
                //orcamentoVO.IdCategoria = this.txtCadSubFamilia.Text;
                if (this.cbAtendido.Checked)
                {
                    orcamentoVO.DataExec = DateTime.Now;
                    orcamentoVO.Status = "D";
                    orcamentoVO.AtendidoPor = usuarioVO.User;
                }
                else
                {
                    orcamentoVO.DataExec = null;
                    orcamentoVO.Status = (orcamentoVO.Status.Equals("C")?"C":"E");
                    orcamentoVO.AtendidoPor = "";
                }
                try { orcamentoVO.DataValid = DateTime.Parse(this.txtCadValid.Text); }
                catch (Exception ex) { orcamentoVO.DataValid = null; }
                orcamentoVO.Obs = this.txtCadObs.Text;

                //Chama metodo para salvar ou criar novo registro
                orcamentoBO.SalvaOrcamento(orcamentoVO, false);

                List<orcamentoitem> listOrcamentoitemVOs = new List<orcamentoitem>();
                foreach (GridViewRow gvr in this.GridViewItens.Rows)
                {
                    int idOrcamentoItem = Int32.Parse(gvr.Cells[0].Text);
                    orcamentoitem orcamentoItemVO = orcamentoItemBO.RecuperaOrcamentoItem(idOrcamentoItem);
                    
                    //orcamentoItemVO.IdOrcamento = orcamentoVO.IdOrcamento;
                    //orcamentoItemVO.IdProduto = Int32.Parse(gvr.Cells[1].Text);
                    //orcamentoItemVO.Quantidade = Int32.Parse(gvr.Cells[2].Text);
                    orcamentoItemVO.ValorUnit = Decimal.Parse(((TextBox)gvr.Cells[4].Controls[1]).Text);
                    orcamentoItemVO.ValorTotal = Decimal.Parse(gvr.Cells[5].Text);
                    orcamentoItemVO.Obs = ((TextBox)gvr.Cells[6].Controls[1]).Text;

                    orcamentoItemBO.SalvaOrcamentoItem(orcamentoItemVO,false);
                    gvr.Cells[0].Text = orcamentoItemVO.IdOrcamentoItem.ToString();

                    listOrcamentoitemVOs.Add(orcamentoItemVO);
                }

                if (cbEmail.Checked)
                {
                    //enviar email
                    enviaOrcamento(orcamentoVO, listOrcamentoitemVOs);
                }

                // Exibe msg de sucesso ao salvar registro
                Util.ExibeAlert(this, "Registro salvo com sucesso!");

                //Popula grid atualizado
                this.btnPesquisa_Click(null, null);

                //Limpa formulario, apos salvar os dados
                Util.LimparCampos(this.panelCad);
                this.grvResultado.DataSource = null;
                this.grvResultado.DataBind();
                this.cbAtendido.Checked = false;
                this.cbEmail.Checked = false;
                this.ltAtendido.Text = "";
                this.ltAtendidoPor.Text = "";

                //foreach (GridViewRow gvr in this.GridViewCategoria.Rows)
                //{
                //    ((CheckBox)gvr.Cells[0].Controls[1]).Checked = false;
                //}

                // Trava bot&atilde;o de edi&ccedil;&atilde;o
                this.btnEditar.Enabled = false;

                // Trava bot&atilde;o de exclusao
                this.btnExcluir.Enabled = false;

                // Desabilita o bot&atilde;o salvar
                this.btnSalvar.Enabled = false;

                // Habilida o botao novo
               // this.btnNovo.Enabled = true;


                Util.HabilitarCampos(false, this.panelCad);
                this.GridViewItens.Enabled = false;
                this.ButtonRecalcular.Enabled = false;
            }
            catch (Exception ex)
            {

                throw ex;
            }
        }

        /// <summary>
        /// Manipula o evento do bot&atilde;o btnPesquisa
        /// </summary>
        /// <param name="sender">Objeto disparador do evento</param>
        /// <param name="e">Argumento do evento</param>
        protected void btnPesquisa_Click(object sender, EventArgs e)
        {

            string status = this.RadioButtonList2.SelectedValue;
            try
            {
                //
                this.grvResultado.DataSource = new OrcamentoBO().RecuperaOrcamento(null, null,status);

                //Vincula os dados
                this.grvResultado.DataBind();
            }
            catch (Exception ex)
            {

                throw ex;
            }
        }

        /// <summary>
        /// Manipula o evento do bot&atilde;o btnCancelar
        /// </summary>
        /// <param name="sender">Objeto disparador do evento</param>
        /// <param name="e">Argumento do evento</param>
        protected void btnCancelar_Click(object sender, EventArgs e)
        {
            this.tabOrcamento.ActiveTabIndex = 0;

            // Desabilita os campos para edi&ccedil;&atilde;o
            Util.HabilitarCampos(false, this.panelCad);
            this.GridViewItens.Enabled = false;
            this.ButtonRecalcular.Enabled = false;

            // Destrava bot&atilde;o de edi&ccedil;&atilde;o
            this.btnEditar.Enabled = !string.IsNullOrEmpty(this.txtCadId.Text);

            // Detrava bot&atilde;o de exclusao
            this.btnExcluir.Enabled = !string.IsNullOrEmpty(this.txtCadId.Text);

            // Detrava bot&atilde;o de novo
            //this.btnNovo.Enabled = true;

            // Desabilita o bot&atilde;o salvar
            this.btnSalvar.Enabled = false;

        }

        protected void GridViewItens_RowDataBound(object sender, GridViewRowEventArgs e)
        {
            if (e.Row.RowType == DataControlRowType.DataRow)
            {
                int idProduto = Int32.Parse(e.Row.Cells[1].Text);
                produto produtoVO = new ProdutoBO().RecuperaProduto(idProduto);
                e.Row.Cells[1].Text = produtoVO.IdProduto.ToString() + "-" + produtoVO.Produto;
                e.Row.Cells[3].Text = produtoVO.Embalagem;
                e.Row.Cells[5].Text = (int.Parse(e.Row.Cells[2].Text) * Decimal.Parse(((TextBox)e.Row.Cells[4].Controls[1]).Text)).ToString("#,##0.00");
            }
        }

        protected void imgbVisualizar_Click(object sender, ImageClickEventArgs e)
        {
            // Declara objetos
            OrcamentoBO orcamentoBO = null;
            orcamento orcamentoVO = null;
            int idOrcamento = 0;

            try
            {
                // cria objeto
                orcamentoBO = new OrcamentoBO();

                //
                idOrcamento = int.Parse(((ImageButton)sender).CommandArgument);

                //
                orcamentoVO = orcamentoBO.RecuperaOrcamento(idOrcamento); ;

                this.txtCadId.Text = idOrcamento.ToString();
                this.txtCadIdCliente.Text = orcamentoVO.IdCliente.ToString();
                cliente clienteVO = new ClienteBO().RecuperaCliente(orcamentoVO.IdCliente);
                this.txtCadNomeCliente.Text = clienteVO.Nome;
                this.txtCadObs.Text = orcamentoVO.Obs;
                this.txtCadSolic.Text = orcamentoVO.DataSolic.Value.ToShortDateString();
                if (orcamentoVO.DataValid != null)
                    this.txtCadValid.Text = orcamentoVO.DataValid.Value.ToShortDateString();
                else
                    this.txtCadValid.Text = "";
                this.ltAtendidoPor.Text = orcamentoVO.AtendidoPor;
                if (orcamentoVO.DataExec != null)
                    this.ltAtendido.Text = orcamentoVO.DataExec.Value.ToShortDateString();
                else
                    this.ltAtendido.Text = "";
                this.cbAtendido.Checked = (orcamentoVO.DataExec != null);
                this.cbEmail.Checked = false;
                this.ltStatus.Text = (orcamentoVO.Status.Equals("C") ? "N&atilde;o finalizado pelo cliente ainda!" : (orcamentoVO.Status.Equals("E") ? "Or&ccedil;amento em atendimento" : "Or&ccedil;amento j&aacute; Dispon&iacute;vel ao Cliente!"));

                List<orcamentoitem> listOrcamentoItem = new OrcamentoItemBO().RecuperaOrcamentoItem(null, orcamentoVO.IdOrcamento, null);
                this.GridViewItens.DataSource = listOrcamentoItem;
                this.GridViewItens.DataBind();

                //
                this.tabOrcamento.ActiveTabIndex = 1;

                //
                Util.HabilitarCampos(false, this.panelCad);
                //this.GridViewCategoria.Enabled = false;

                //
                this.btnSalvar.Enabled = false;

                //
                this.btnEditar.Enabled = true;

                //
                this.btnExcluir.Enabled = true;

                //
//                this.btnNovo.Enabled = true;


            }
            catch (Exception ex)
            {

                throw ex;
            }
        }

        /// <summary>
        /// Manipula o evento editar do web form
        /// </summary>
        /// <param name="sender">Objeto disparador de evento</param>
        /// <param name="e">Argumento do evento</param>
        protected void btnEditar_Click(object sender, EventArgs e)
        {
            // Habilita os campos para edi&ccedil;&atilde;o
            Util.HabilitarCampos(true, this.panelCad);
            this.GridViewItens.Enabled = true;
            this.ButtonRecalcular.Enabled = true;

            // Trava apenas o text box do ID
            this.txtCadId.Enabled = false;
            this.txtCadIdCliente.Enabled = false;
            this.txtCadNomeCliente.Enabled = false;
            this.txtCadSolic.Enabled = false;

            // Trava bot&atilde;o de edi&ccedil;&atilde;o
            this.btnEditar.Enabled = false;

            // Trava bot&atilde;o de exclusao
            this.btnExcluir.Enabled = false;

            // Trava bot&atilde;o de novo
            //this.btnNovo.Enabled = false;

            // Habilita o bot&atilde;o salvar
            this.btnSalvar.Enabled = true;

            if (this.txtCadObs.Text.Length == 0)
                    this.txtCadObs.Text = @"OBSERVAÇÕES:
Atenção: Artigos especiais poderá haver uma oscilação de 5% para mais ou a menos na qtde.
Condições de Pagamento: à vista
O presente orçamento é válido por 10 dias e está sujeito a confirmação;
Prazo de Entrega: Imediato, após a confirmação do pedido / depósito
Transporte: FOB;
Incluir IPI discriminado no valor total.";

            this.txtCadObs.Focus();

        }

 /*       protected void btnNovo_Click(object sender, EventArgs e)
        {
            //Limpa formulario, para a entrada de novo registro
            Util.LimparCampos(this.panelCad);
            Util.LimparCampos(this.TabPanelFileUpload);
            this.ltCadastradoPor.Text = "";
            this.ltEditadoPor.Text = "";
            this.ltDataCadastro.Text = "";
            this.ltDataEdicao.Text = "";

            foreach (GridViewRow gvr in this.GridViewCategoria.Rows)
            {
                ((CheckBox)gvr.Cells[0].Controls[1]).Checked = false;
            }


            // Habilita os campos para edi&ccedil;&atilde;o
            Util.HabilitarCampos(true, this.panelCad);
            this.GridViewCategoria.Enabled = true;

            // Trava apenas o text box do ID
            this.txtCadId.Enabled = false;

            // Trava bot&atilde;o de edi&ccedil;&atilde;o
            this.btnEditar.Enabled = false;

            // Trava bot&atilde;o de exclusao
            this.btnExcluir.Enabled = false;

            // Trava bot&atilde;o de novo
            this.btnNovo.Enabled = false;

            // Habilita o bot&atilde;o salvar
            this.btnSalvar.Enabled = true;

            // Trava upload de imagem
            this.AsyncFileUploadPQ.Enabled = false;
            this.AsyncFileUploadGD.Enabled = false;
            this.btnVisualizarImagem.Enabled = false;

            this.txtCadOrcamento.Focus();

        }
*/

        protected void btnExcluir_Click(object sender, EventArgs e)
        {
            //Declara objetos
            orcamento orcamentoVO = null;
            OrcamentoBO orcamentoBO = null;
            OrcamentoItemBO orcamentoItemBO = null;

            try
            {
                //Cria objeto
                orcamentoBO = new OrcamentoBO();
                orcamentoItemBO = new OrcamentoItemBO();

                orcamentoVO = new orcamento();

                orcamentoVO.IdOrcamento = Int32.Parse(this.txtCadId.Text);

                //Chama metodo para salvar ou criar novo registro
                orcamentoBO.DeletaOrcamento(orcamentoVO);
                orcamentoItemBO.DeletaOrcamentoItens(orcamentoItemBO.RecuperaOrcamentoItem(null,orcamentoVO.IdOrcamento, null));

                // Exibe msg de sucesso ao salvar registro
                Util.ExibeAlert(this, "Registro excluido com sucesso!");

                //Popula grid atualizado
                this.btnPesquisa_Click(null, null);

                //Limpa formulario, apos salvar os dados
                Util.LimparCampos(this.panelCad);
                this.cbAtendido.Checked = false;
                this.cbEmail.Checked = false;
                this.ltAtendido.Text = "";
                this.ltAtendidoPor.Text = "";

                this.GridViewItens.DataSource = null;
                this.GridViewItens.DataBind();


                // Trava bot&atilde;o de edi&ccedil;&atilde;o
                this.btnEditar.Enabled = false;

                // Trava bot&atilde;o de exclusao
                this.btnExcluir.Enabled = false;

                // Desabilita o bot&atilde;o salvar
                this.btnSalvar.Enabled = false;

                // Habilida o botao novo
                //this.btnNovo.Enabled = true;

            }
            catch (Exception ex)
            {

                throw ex;
            }
            
        }

        protected void Recalcular(object sender, EventArgs e)
        {
            foreach (GridViewRow gvr in this.GridViewItens.Rows)
            {
                gvr.Cells[5].Text = (int.Parse(gvr.Cells[2].Text) * Decimal.Parse(((TextBox)gvr.Cells[4].Controls[1]).Text)).ToString("#,##0.00");
            }
        }

        protected void enviaOrcamento(orcamento orcamentoVO, List<orcamentoitem> listOrcamentoitemVOs)
        {
            string imgCabecalho = Server.MapPath(@"App_Themes/Padrao/imagens/backoffice/cabecalhoemail.jpg");
            string imgAssinatura = Server.MapPath(@"App_Themes/Padrao/imagens/backoffice/assinaturaemail.jpg");

            ProdutoBO produtoBO = new ProdutoBO();
            cliente clienteVO = new ClienteBO().RecuperaCliente(orcamentoVO.IdCliente);

            StringBuilder mensagem = new StringBuilder();

            mensagem.AppendLine("<html><body>");
            mensagem.AppendLine("<p style=\"text-align: center; margin: 0px\">");
            mensagem.AppendLine("    <img src='cid:cabecalhoemail'><br>");
            mensagem.AppendLine("    <span style=\"font-family: arial,helvetica,sans-serif; color: #663333; font-size: 14pt; font-weight: bold; text-decoration: underline\">");
            mensagem.AppendLine("        &nbsp;<br />");
            mensagem.AppendLine("        Or&#231;amento");
            mensagem.AppendLine("    </span>");
            mensagem.AppendLine("</p>");
            mensagem.AppendLine("&nbsp;<br />");
            mensagem.AppendLine("&nbsp;<br />");
            mensagem.AppendLine("<span style=\"font-family:Arial,Helvetica,sans-serif; font-size: 10pt; color: #330066\">");
            mensagem.AppendLine("    Atendendo a sua solicita&#231;&#227;o temos a grata satisfa&#231;&#227;o de fornece-lhes or&#231;amento para os materiais abaixo discriminados.<br />");
            mensagem.AppendLine("    &nbsp;<br />");
            if (clienteVO.Tipo.Equals("PF"))
                mensagem.AppendLine("    Cliente: " + clienteVO.Nome + " " + clienteVO.Sobrenome + "<br />");
            else
                mensagem.AppendLine("    Cliente: " + clienteVO.NomePJ + "<br />");
            mensagem.AppendLine("    Cidade: " + clienteVO.Cidade + " / estado: " + clienteVO.Estado + "<br />");
            if (clienteVO.Tipo.Equals("PF"))
            {
                mensagem.AppendLine("    Fone: " + clienteVO.FoneRes.Substring(0,2)+" "+clienteVO.FoneRes.Substring(2) + "<br />");
            }
            else
            {
                mensagem.AppendLine("    Contato: " + clienteVO.Nome + " " + clienteVO.Sobrenome + "<br />");
                mensagem.AppendLine("    Fone: " + clienteVO.FoneComl.Substring(0, 2) + " " + clienteVO.FoneComl.Substring(2) + "<br />");
            }
            mensagem.AppendLine("    &nbsp;<br />");
            mensagem.AppendLine("</span>");
            mensagem.AppendLine("<span style=\"font-family: Courier, 'Courier New', monospace; font-size: 9pt; color: #660000\">");
            mensagem.AppendLine("	<table border=\"1\">");
            mensagem.AppendLine("		<tr><td colspan=\"6\">Or&ccedil;amento " + orcamentoVO.IdOrcamento + " - solicitado em " + orcamentoVO.DataSolic.Value.ToString("dd/MM/yyyy") + "</td></tr>");
            mensagem.AppendLine("		<tr><td colspan=\"6\">Artigo:</td></tr>");
            mensagem.AppendLine("		<tr><td>Ref.</td><td>Produto</td><td>Quantid.</td><td>Vlr Unitario</td><td>Vlr Total</td><td>Obs.</td></tr>");
            
            decimal valorTotal = 0.0M;
            foreach (orcamentoitem oi in listOrcamentoitemVOs)
            {
                produto p = produtoBO.RecuperaProduto(oi.IdProduto);
                mensagem.AppendLine("<tr><td>" + p.Referencia+ "</td><td>" + p.Produto + "</td><td>" + oi.Quantidade.Value.ToString("#,##0").PadLeft(9) + "</td><td>R$ " + oi.ValorUnit.Value.ToString("#,##0.00").PadLeft(12) + "</td><td>R$ " + oi.ValorTotal.Value.ToString("#,##0.00").PadLeft(12) + "</td><td>" + oi.Obs + "</td></tr>");
                valorTotal += oi.ValorTotal.Value;
            }
            mensagem.AppendLine("		<tr><td colspan=\"6\">Valor Total= R$ " + valorTotal.ToString("#,##0.00")+"</td></tr>");
            mensagem.AppendLine("    </table>");
            mensagem.AppendLine("    &nbsp;<br />");
            mensagem.AppendLine("    &nbsp;<br />");
            mensagem.AppendLine("</span>");
            mensagem.AppendLine("<span style=\"font-family:Arial,Helvetica,sans-serif; font-size: 10pt; color: #330066\">");
            if (orcamentoVO.Obs != null && orcamentoVO.Obs.Length > 0)
            {
                mensagem.AppendLine(orcamentoVO.Obs.Replace("\n","<br />"));
            }
            mensagem.AppendLine("    &nbsp;<br />");
            mensagem.AppendLine("    No seu aguardo e &#224; sua disposi&#231;&#227;o.<br />");
            mensagem.AppendLine("    Sds.");
            mensagem.AppendLine("</span><br><br>");
            mensagem.AppendLine("<img src='cid:assinaturaemail'><br>");
            mensagem.AppendLine("</body></html>");


            AlternateView av = AlternateView.CreateAlternateViewFromString(mensagem.ToString(), null, MediaTypeNames.Text.Html);
            LinkedResource lr1 = new LinkedResource(imgCabecalho, MediaTypeNames.Image.Jpeg);
            LinkedResource lr2 = new LinkedResource(imgAssinatura, MediaTypeNames.Image.Jpeg);
            lr1.ContentId = "cabecalhoemail";
            lr2.ContentId = "assinaturaemail";

            av.LinkedResources.Add(lr1);
            av.LinkedResources.Add(lr2);


            MailMessage oEmail = new MailMessage();
            MailAddress sDe = new MailAddress(ConfigurationManager.AppSettings["Email.Orcamento"]);

            oEmail.To.Add(clienteVO.Email);
            oEmail.From = sDe;
            oEmail.CC.Add(ConfigurationManager.AppSettings["Email.CC"]);
            oEmail.Priority = MailPriority.Normal;
            oEmail.Subject = "Déo Plásticos - Solicitação de orçamento número "+orcamentoVO.IdOrcamento;
            oEmail.AlternateViews.Add(av);  
            oEmail.Body = mensagem.ToString();
            oEmail.IsBodyHtml = true;

            //Attachment attachment1 = new Attachment(imgCabecalho);
            //Attachment attachment2 = new Attachment(imgAssinatura);
            //oEmail.Attachments.Add(attachment1);
            //oEmail.Attachments.Add(attachment2);   

            SmtpClient oEnviar = new SmtpClient();
            oEnviar.Host = ConfigurationManager.AppSettings["Email.Host.SMTP"];
            oEnviar.Port = int.Parse(ConfigurationManager.AppSettings["Email.Host.SMTP.Port"]);
            oEnviar.Credentials = new NetworkCredential(
                                            ConfigurationManager.AppSettings["Email.Administrador"],
                                            ConfigurationManager.AppSettings["Email.Administrador.Pass"]);
            oEnviar.Send(oEmail);
            oEmail.Dispose();
           
        }
    }
}
